#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
using namespace std;

volatile int quit = 0;

void handler(int signo)
{
    cout << "处理信号：" << signo << endl;
    cout << quit << "->";
    quit = 1;
    cout << quit << endl;
}

int main()
{

    signal(SIGINT, handler);

    while (!quit)
        ;
    cout << "我是正常退出的" << endl;
    return 0;
}

// #include <iostream>
// #include <string>
// #include <vector>
// #include <cstdlib>
// #include <sys/types.h>
// #include <unistd.h>
// #include <signal.h>

// using namespace std;

// void Count(int cnt)
// {
//     while (--cnt)
//     {
//         printf("cnt: %d\r", cnt);
//         fflush(stdout);
//         sleep(1);
//     }
// }

// void myhandler(int signo)
// {
//     cout << "正在处理信号：" << signo << endl;
//     Count(10);
// }

// int main()
// {
//     struct sigaction act, oact;

//     sigemptyset(&act.sa_mask);

//     act.sa_handler = myhandler;
//     act.sa_flags = 0;
//     act.sa_restorer = nullptr;

//     sigaddset(&act.sa_mask, 3);

//     sigaction(SIGINT, &act, &oact);

//     while (true)
//         sleep(1);

//     return 0;
// }

// static vector<int> sigArray = { 2,3 };

// void sigPrint(sigset_t* pending)
// {
//     for (int signo = 31; signo >= 1; --signo)
//     {
//         if (sigismember(pending, signo))
//         {
//             cout << "1";
//         }
//         else 
//         {
//             cout << "0";
//         }
//     }
//     cout << endl;
// }

// void myhandler(int signo)
// {
//     cout << "执行的信号为：" << signo << endl;
// }

// int main()
// {

//     for (const auto& signo : sigArray) 
//     {
//         //获取指定信号，执行自定义语句
//         signal(signo, myhandler);
//     }

//     sigset_t block, oblock, pending;
//     //初始化信号
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     sigemptyset(&pending);


//     //添加要屏蔽的信号
//     for (const auto& blockset : sigArray)
//     {
//         sigaddset(&block, blockset);
//     }

//     //开始屏蔽，进入内核
//     sigprocmask(SIG_SETMASK, &block, &oblock);

//     int cnt = 10;

//     while (true)
//     {
//         //重新初始化pending
//         sigemptyset(&pending);
//         //获取未决信号（被阻塞的信号）
//         sigpending(&pending);

//         sigPrint(&pending);

//         sleep(1);

//         if (cnt-- == 0)
//         {
//             sigprocmask(SIG_SETMASK, &oblock, &block);
//             cout << "解除信号完毕" << endl;
//             cnt = 10;
//             sigprocmask(SIG_SETMASK, &block, &oblock);
//         }
//     }

//     return 0;
// }

// void handler(int signo)
// {
//     cout << "接收到的信号为：" << signo << endl;
// }

// int main()
// {
//     signal(SIGINT, handler);

//     while (true) 
//     {
//         cout << "我是一个进程, 我的进程pid为: " << getpid() << endl;
//         sleep(1);
//     }

//     return 0;
// }

// void PtintWorringMassage(std::string proc)
// {
//     std::cout << proc << " pid signo " << std::endl;
// }

// int main(int argc, char* argv[])
// {
//     if (argc != 3)
//     {
//         PtintWorringMassage(argv[0]);
//         exit(1);
//     }

//     pid_t pid = atoi(argv[1]);
//     int signo = atoi(argv[2]);
//     int n = kill(pid, signo);
//     if (n != 0)
//     {
//         std::cerr << "kill" << std::endl;
//     }
//     return 0;
// }